java面试题之什么是死锁、活锁、饿死和竞态条件?
- 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们将无法推进下去;
- 活锁:是指两个线程优先级相同,都礼让不走,就这样一直僵持下去;
- 饿死:在单线程情况下,A、B两个线程,A先执行;A在执行过程中,C线程来了,B让C先执行;C在执行过程中,D线程来了,B也让D先执行,就这样B一直都是等待状态。
- 竞态条件:多个线程竞争同一个变量,导致数据的不正确性,线程的访问顺序是不可控的,会影响最终的结果。
产生死锁的必要条件:
1、互斥使用(资源独占)
一个资源每次只能给一个进程使用(比如写操作)
2、占有且等待:
进程在申请新的资源的同时,保持对原有资源的占有
3、不可抢占:
资源申请者不能强行从资源占有者手动夺取资源,资源只能由占有者自愿释放
4、循环等待:
A等待B占有的资源,B等待C占有的资源,C等待D占有的资源,..........N等待A的资源,形成一个线程等待回路
不积跬步无以至千里不积小流无以成江海